package com.merry.BeanDefinitionReader;

import org.springframework.beans.factory.BeanDefinitionStoreException;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanNameGenerator;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.lang.Nullable;

/**
 * BeanDefinitionReader 接口的定义：使用资源和字符串位置参数指定加载方法。
 * 具体的实现类可以为 BeanDefinition 的加载提供一些额外的方法，这主要取决与BeanDefinition的格式。
 * 请注意，bean定义读取器不必实现此接口。它仅作为希望遵循标准命名约定的bean定义读者的建议。
 *  从这几句话，我可以推断出来：
 *      1.不同的BeanDefinition有不同的加载方法，这个接口的定义太老了，那么对于注解的方法，他会不会有一个新的类来完成呢？
 *      2.Bean的阅读器不一定要实现这个接口，那么肯定存在一些可以完成类似功能的实现类，但是它没有实现这个接口。
 *
 */
public interface BeanDefinitionReader {

    /**
     * 返回Bean的注册器，在注册器那里我们知道了，实现注册器的接口都是些【BeanFactory】的实现类，
     * 具体来说是【DefaultListableBeanFactory】、【GenericApplicationContext】
     */
    BeanDefinitionRegistry getRegistry();

    /**
     * 返回一个ResourceLoader，相当于告诉Spring，我写的代码在那个位置。
     */
    @Nullable
    ResourceLoader getResourceLoader();

    /**
     * 返回加载这个bean的ClassLoader是什么。
     */
    @Nullable
    ClassLoader getBeanClassLoader();

    /**
     * 返回BeanName的生成器。
     */
    BeanNameGenerator getBeanNameGenerator();


    /**
     * 从指定的资源位置，加载bean。
     */
    int loadBeanDefinitions(Resource resource) throws BeanDefinitionStoreException;

    /**
     * 从指定的资源位置，加载bean。
     */
    int loadBeanDefinitions(Resource... resources) throws BeanDefinitionStoreException;

    /**
     * 从指定的位置加载bean。
     */
    int loadBeanDefinitions(String location) throws BeanDefinitionStoreException;

    /**
     * 从指定的位置加载bean。
     */
    int loadBeanDefinitions(String... locations) throws BeanDefinitionStoreException;

}

